package main

import (
	"fmt"
	"runtime"
)

func main() {
	go func() {
		defer fmt.Println("A.defer")
		func() {
			defer fmt.Println("B.defer")
			runtime.Goexit() // 结束当前协程
			defer fmt.Println("C.defer")
			fmt.Println("B")
		}()
		fmt.Println("A")
	}()

	fmt.Println("main")
}

/**
输出结果：
main
B.defer
A.defer
或者
main
B.defer
或者
main

在我们自己的协程结束之前，是会打印已定义的B.defer和A.defer 的，这说明：

如果我们用runtime.Goexit()结束协程，仍然会执行defer语句。

第一个结果解释：主协程打印了main，在主协程结束之前的一小段时间，我们的协程抓紧时间执行了defer语句：打印了 B.defer 和 A.defer。释
第二个结果解释：主协程打印了main，在主协程结束之前的一小段时间，我们的协程虽然抓紧时间，但只打印了 B.defer，没来得及打印A.defer。
第三个结果解释：主协程打印了main，这次我们的协程虽然紧赶慢赶，但没能赶上执行 defer 语句，一切都结束了。
*/
